package com.thinkgem.jeesite.common.utils;

import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tempuri.KLWRFIDServer;
import org.tempuri.KLWRFIDServerStub;
import org.tempuri.KLWRFIDService;

import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.modules.guobo.dao.RwDao;
import com.thinkgem.jeesite.modules.guobo.entity.Dispatched;
import com.thinkgem.jeesite.modules.guobo.entity.Grant;
import com.thinkgem.jeesite.modules.guobo.entity.HardwareReturn;
import com.thinkgem.jeesite.modules.guobo.entity.Operation;
import com.thinkgem.jeesite.modules.guobo.entity.Position;
import com.thinkgem.jeesite.modules.guobo.entity.Rw;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 国博硬件接口工具类
 * @author wudavid
 *
 */
public class OperationWebServiceUtils {
	
	private static Logger logger = LoggerFactory.getLogger(OperationWebServiceUtils.class);
	
	
	/**
	 * 布控
	 * @param code 操作码,YES布防,Cancel取消布防,Pause暂停布防,Start开始布防,Reset重置
	 * @param rwids 读写器id
	 * @param rfids rfid编码集合
	 * @return
	 * @throws Exception
	 */
	public static String dispatch(String code,List<String> rwids,List<String> rfids) throws Exception{
		Operation operation = new Operation();
        //布防
        operation.setOperationStyle("DISPATCHING");
        operation.setOperationCode(code);
        //操作指令
        String jsonString = JSONObject.fromObject(operation).toString();
        Dispatched dispatched = new Dispatched();
        List<String> temprwids = new ArrayList<String>();
        RwDao rwDao = SpringContextHolder.getBean(RwDao.class);
        for (String rwid : rwids) {
        	Rw rw = rwDao.get(rwid);
        	temprwids.add(rw.getAddress());
		}
        dispatched.setReaderAdr(temprwids);
        dispatched.setEpcs(rfids);
        //操作数据
        String jsonData = JSONObject.fromObject(dispatched).toString();
        //jsonData = StringUtils.jsonStringCaptureName(jsonData);
        logger.info("jsonString>>>>>>>>>>>>"+jsonString);
        logger.info("jsonData>>>>>>>>>>>>"+jsonData);
		// 使用RPC方式调用WebService  
        /*RPCServiceClient serviceClient = new RPCServiceClient();  
        Options options = serviceClient.getOptions();  
        EndpointReference targetEPR = new EndpointReference(Global.getConfig("dispatchedURL"));// 指定调用WebService的URL  
        options.setTo(targetEPR);        
        Object[] opAddEntryArgs = new Object[]{jsonString,jsonData};// 指定getGreeting方法的参数值    
        Class[] classes = new Class[]{HardwareReturn.class};// 指定getGreeting方法返回值的数据类型的Class对象  
        // 指定要调用的getGreeting方法及WSDL文件的命名空间  
        QName opAddEntry = new QName("http://tempuri.org",  
                "getUserById");
        //// RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。
        //invokeBlocking方法有三个参数，
        //其中第一个参数的类型是QName对象，表示要调用的方法名；
        //第二个参数表示要调用的WebService方法的参数值，参数类型为Object[]；第三个参数表示WebService方法的返回值类型的Class对象，参数类型为Class[]。
        //当方法没有参数时，invokeBlocking方法的第二个参数值不能是null，而要使用new Object[]{}。
        Object[] objects = serviceClient.invokeBlocking(opAddEntry,  
                opAddEntryArgs, classes);  
        System.out.println("objects size-->:" + objects.length);   
        if (objects.length >= 1)  
        {  
        	HardwareReturn hardwareReturn = new HardwareReturn();  
        	hardwareReturn = (HardwareReturn) objects[0];  
        	System.out.println("返回参数为:"+hardwareReturn.getResult()+","+hardwareReturn.getMessage());
        	return hardwareReturn.getResult();
        }  
		return null;*/
        KLWRFIDServer klwrfidserver = new KLWRFIDServerStub(Global.getConfig("locationOperationURL"));
		KLWRFIDService kLWRFIDService2 = new KLWRFIDService();
		kLWRFIDService2.setJsonOperation(jsonString);
		kLWRFIDService2.setJsonData(jsonData);
		String resultMSG = klwrfidserver.kLWRFIDService(kLWRFIDService2).getKLWRFIDServiceResult();
		JSONObject jsonObject = JSONObject.fromObject(resultMSG);  
		String result = jsonObject.get("result").toString();
		String message = jsonObject.get("message").toString();
		logger.info("接口返回:"+resultMSG);
		return result;
	}
	
	/**
	 * 位置信息
	 * @param rw 读写器对象
	 * @return
	 */
	public static String locationOperation(List<Rw> rws) throws Exception{
		Operation operation = new Operation();
        //位置信息上传操作指令
        operation.setOperationStyle("POSITION");
        operation.setOperationCode("Add");
        String jsonString = JSONObject.fromObject(operation).toString();
        List<Position> pos = new ArrayList<Position>();
        for (Rw rw : rws) {
        	Position position = new Position();
            position.setPositionId(rw.getId());
            position.setArea(rw.getLocation().getExhHall().getRegion().getName());
            position.setPavilion(rw.getLocation().getExhHall().getName());
            position.setDoor(rw.getLocation().getName());
            position.setReaderAdr(rw.getAddress());
            position.setReaderType(rw.getType());
            position.setAnt("1");
            pos.add(position);
		}
        String jsonData = JSONArray.fromObject(pos).toString(); 
        //jsonString = StringUtils.jsonStringCaptureName(jsonString);
        //jsonData = StringUtils.jsonStringCaptureName(jsonData);
        logger.info("jsonString>>>>>>>>>>>>"+jsonString);
        logger.info("jsonData>>>>>>>>>>>>"+jsonData);
        /*// 使用RPC方式调用WebService  
        RPCServiceClient serviceClient = new RPCServiceClient();  
        Options options = serviceClient.getOptions();  
        options.setAction("http://tempuri.org/KLWRFIDService");
        EndpointReference targetEPR = new EndpointReference(Global.getConfig("locationOperationURL"));// 指定调用WebService的URL 
        options.setTo(targetEPR);        
        Object[] opAddEntryArgs = new Object[]{"hello"};// 指定getGreeting方法的参数值    
        Class[] classes = new Class[]{HardwareReturn.class};// 指定getGreeting方法返回值的数据类型的Class对象  
        // 指定要调用的getGreeting方法及WSDL文件的命名空间  
        QName opAddEntry = new QName("http://tempuri.org/",  
                "KLWRFIDService");
        //// RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。
        //invokeBlocking方法有三个参数，
        //其中第一个参数的类型是QName对象，表示要调用的方法名；
        //第二个参数表示要调用的WebService方法的参数值，参数类型为Object[]；第三个参数表示WebService方法的返回值类型的Class对象，参数类型为Class[]。
        //当方法没有参数时，invokeBlocking方法的第二个参数值不能是null，而要使用new Object[]{}。
        Object[] objects = serviceClient.invokeBlocking(opAddEntry,  
                opAddEntryArgs, classes);  
        if (objects.length >= 1)  
        {  
        	HardwareReturn hardwareReturn = new HardwareReturn();  
        	hardwareReturn = (HardwareReturn) objects[0];  
        	System.out.println("返回参数为:"+hardwareReturn.getResult()+","+hardwareReturn.getMessage());
        	return hardwareReturn.getResult();
        }         */ 
        KLWRFIDServer klwrfidserver = new KLWRFIDServerStub(Global.getConfig("locationOperationURL"));
		KLWRFIDService kLWRFIDService2 = new KLWRFIDService();
		kLWRFIDService2.setJsonOperation(jsonString);
		kLWRFIDService2.setJsonData(jsonData);
		String resultMSG = klwrfidserver.kLWRFIDService(kLWRFIDService2).getKLWRFIDServiceResult();
		JSONObject jsonObject = JSONObject.fromObject(resultMSG);  
		String result = jsonObject.get("result").toString();
		String message = jsonObject.get("message").toString();
		logger.info("接口返回:"+resultMSG);
		return result;
	}
	
	/**
	 * 授权卡授权
	 * @param code 授权操作符 Add为增加授权,Cancel为取消授权
	 * @param rfids 授权的rfid集合
	 * @return
	 * @throws Exception
	 */
	public static String grant(String code,List<String> rfids) throws Exception {
		Operation operation = new Operation();
        //位置信息上传操作指令
        operation.setOperationStyle("GRANT");
        operation.setOperationCode(code);
        String jsonString = JSONObject.fromObject(operation).toString();
        String jsonData = JSONArray.fromObject(rfids).toString();
        //jsonData = StringUtils.jsonStringCaptureName(jsonData);
        logger.info("jsonString>>>>>>>>>>>>"+jsonString);
        logger.info("jsonData>>>>>>>>>>>>"+jsonData);
        /*//使用RPC方式调用WebService  
        RPCServiceClient serviceClient = new RPCServiceClient();  
        Options options = serviceClient.getOptions();  
        EndpointReference targetEPR = new EndpointReference(Global.getConfig("locationOperationURL"));// 指定调用WebService的URL  
        options.setTo(targetEPR);        
        Object[] opAddEntryArgs = new Object[]{jsonString,jsonData};// 指定getGreeting方法的参数值    
        Class[] classes = new Class[]{HardwareReturn.class};// 指定getGreeting方法返回值的数据类型的Class对象  
        // 指定要调用的getGreeting方法及WSDL文件的命名空间  
        QName opAddEntry = new QName("http://tempuri.org",  
                "getUserById");
        //// RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。
        //invokeBlocking方法有三个参数，
        //其中第一个参数的类型是QName对象，表示要调用的方法名；
        //第二个参数表示要调用的WebService方法的参数值，参数类型为Object[]；第三个参数表示WebService方法的返回值类型的Class对象，参数类型为Class[]。
        //当方法没有参数时，invokeBlocking方法的第二个参数值不能是null，而要使用new Object[]{}。
        Object[] objects = serviceClient.invokeBlocking(opAddEntry,  
                opAddEntryArgs, classes);  
        System.out.println("objects size-->:" + objects.length);   
        if (objects.length >= 1)  
        {  
        	HardwareReturn hardwareReturn = new HardwareReturn();  
        	hardwareReturn = (HardwareReturn) objects[0];  
        	System.out.println("返回参数为:"+hardwareReturn.getResult()+","+hardwareReturn.getMessage());
        	return hardwareReturn.getResult();
        }  
		return null;*/
        KLWRFIDServer klwrfidserver = new KLWRFIDServerStub(Global.getConfig("locationOperationURL"));
		KLWRFIDService kLWRFIDService2 = new KLWRFIDService();
		kLWRFIDService2.setJsonOperation(jsonString);
		kLWRFIDService2.setJsonData(jsonData);
		String resultMSG = klwrfidserver.kLWRFIDService(kLWRFIDService2).getKLWRFIDServiceResult();
		JSONObject jsonObject = JSONObject.fromObject(resultMSG);  
		String result = jsonObject.get("result").toString();
		String message = jsonObject.get("message").toString();
		logger.info("接口返回:"+resultMSG);
		return result;
	}
}
